﻿#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
//int main()
//{
//	char a = -128;
//	//-128的原码:10000000000000000000000010000000
//	//-128的补码:11111111111111111111111110000000
//	//a是char类型，只能存8个比特位
//	//因此a在内存中存的是:10000000                              
//	printf("%u\n", a);//4294967168
//	/*
//	%u是以10进制的形式打印unsigned int类型的数据
//	因此在打印a前，要进行整形提升，将a提升为int类型
//	a属于signed char类型，提升为int类型时，是按它的符号位来提升的，符号位是多少，补码的高位就补多少，补够32个比特位
//	a提升为int类型后的补码:11111111111111111111111110000000 
//	当这串补码被当做unsigned int类型的数据来看待时，a的原反补码相同，且原反补码的每一位都是数值位
//	a的原码:11111111111111111111111110000000 ,即4294967168
//	*/
//	return 0;
//}

//#include <stdio.h>
//int main()
//{
//	char a = 128;
//	//128的原码:00000000000000000000000010000000
//	//128的补码:00000000000000000000000010000000
//	//a是char类型，只能存8个比特位
//	//因此a在内存中存的是:10000000                              
//	printf("%u\n", a);//
//	/*
//	%u是以10进制的形式打印unsigned int类型的数据
//	因此在打印a前，要进行整形提升，将a提升为int类型
//	a属于signed char类型，提升为int类型时，是按它的符号位来提升的，符号位是多少，补码的高位就补多少，补够32个比特位
//	a提升为int类型后的补码:11111111111111111111111110000000
//	当这串补码被当做unsigned int类型的数据来看待时，a的原反补码相同，且原反补码的每一位都是数值位
//	a的原码:11111111111111111111111110000000 ,即4294967168
//	*/
//	return 0;
//}


//#include <stdio.h>
//int main()
//{
//	char a[1000];
//	int i;
//	for (i = 0; i < 1000; i++)
//	{
//		a[i] = -1 - i;
//	}
//	printf("%d", strlen(a));
//	return 0;
//}
//a[i]属于signed char类型，-128<=a[i]<=127
//数组里面存储的是-1、-2、-3....-128、127、126、125....3、2、1、0、-1、-2...



//#include <stdio.h>
//unsigned char i = 0;
//int main()
//{
//	for (i = 0; i <= 255; i++)
//	{
//		printf("hello world\n");
//	}
//	return 0;
//}

//#include <stdio.h>
//int main()
//{
//	unsigned int i;
//	for (i = 9; i >= 0; i--)
//	{
//		printf("%u\n", i);
//	}
//	return 0;
//}
//0的补码 00000000000000000000000000000000
//        11111111111111111111111111111111
//		  11111111111111111111111111111110



//#include <stdio.h>
////X86环境 ⼩端字节序
//int main()
//{
//	int a[4] = { 1, 2, 3, 4 };
//	int* ptr1 = (int*)(&a + 1);
//	int* ptr2 = (int*)((int)a + 1);
//	printf("%x,%x", ptr1[-1], *ptr2);
//	//%x是打印16进制整数的
//	return 0;
//}


//int main()
//{
//	printf("%lf\n", 3e2);//3 * 10^2
//	printf("%lf\n", 3.1e2);//3.1 * 10^2
//	return 0;
//}


//#include <stdio.h>
//int main()
//{
//	int n = 9;
//	float* pFloat = (float*)&n;
//	printf("n的值为：%d\n", n);
//	printf("*pFloat的值为：%f\n", *pFloat);
//	*pFloat = 9.0;
//	printf("n的值为：%d\n", n);
//	printf("*pFloat的值为：%f\n", *pFloat);
//	return 0;
//}

//int main()
//{
//	float a = 5.5f;
//	/*
//	5.5的二进制表示形式:101.1
//	123.45(十进制)用科学计数法表示: 1.2345 * 10^2
//	101.1(二进制)用科学计数法表示: 1.011 * 2^2
//	将a的二进制写成国际标准IEEE（电⽓和电⼦⼯程协会)754提供的公式就是(-1)^0 * 1.011 * 2^2
//	                                                                  S = 0  M = 1.011 E = 2
//    则S在内存中存的是0，E在内存中存的是2+127，即10000001，M在内存中存的是01100000000000000000000
//	因此a在内存中存储的值是:01000000101100000000000000000000
//	这串2进制转换成16进制:0x40b00000
//	*/
//
//	
//
//	float b = -5.5f;
//	/*
//	-5.5写成二进制的形式:-101.1
//	123.45(十进制)用科学计数法表示: 1.2345 * 10^2
//	-101.1(二进制)用科学计数法表示: -1.011 *2^2
//	将b的二进制写成国际标准IEEE（电⽓和电⼦⼯程协会)754提供的公式就是(-1)^1 * 1.011 * 2^2
//	                                                                   S=1    M=1.011 E=2
//    则S在内存中存的是1，E在内存中存储的是2+127，即10000001，M在内存中存储的是01100000000000000000000
//	因此b在内存中存储的值是:11000000101100000000000000000000
//	这串2进制转换成16进制:0xc0b00000
//	
//	*/
//	/*
//	因此只要确定了S、M、E的值时，浮点数的值就确定了
//	也就是说只需要存储S、M、E的值，就可以确定浮点数的值
//	*/
//	return 0;
//}


#include <stdio.h>
int main()
{
	int n = 9;
	//9的原码:00000000000000000000000000001001
	//9的补码:00000000000000000000000000001001
	//n在内存中存储的值:00000000000000000000000000001001
	float* pFloat = (float*)&n;
	printf("n的值为：%d\n", n);//将9以整数的形式存入内存中，再以整数的视角取出来后，n的值依然是9
	/*
	n在内存中存储的值:0 00000000 00000000000000000001001
	则这串二进制以浮点数的视角来看的话
	S=0, E在内存中存的值为全0，则E的真实值为1-127，即-126，M=1.00000000000000000001001
	故这个浮点数按照公式可以表示为(-1)^0 * 0.00000000000000000001001 * 2^(-126)
	其中2^(-126)表示将M的小数点向左移动126位，那么这个浮点数就太小太小了，%f默认打印小数点后6位
	*/
	printf("*pFloat的值为：%f\n", *pFloat);//0.000000


	*pFloat = 9.0;
	/*
	9.0的二进制表示形式1001.0
	1001.0(二进制)用科学计数法表示:1.001 * 2^3
	将9.0的二进制用公式表示:(-1)^0 * 1.001 * 2^3
	                        则S=0,M=1.001,E=3
    则E在内存中存储的值是3+127，即10000010
	M在内存中存储的值是00100000000000000000000
	故9.0在内存中存储的值是0 10000010 00100000000000000000000
	这串二进制以整数的视角来看，n的补码是0 10000010 00100000000000000000000(补码的最高位为0，是正整数，正整数的原反补码相同)
	n的原码:0 10000010 00100000000000000000000  ，即1091567616
	01000001000100000000000000000000
	*/
	printf("n的值为：%d\n", n);//1091567616
	printf("*pFloat的值为：%f\n", *pFloat);//9.000000
	//将9.0以浮点数的形式存到内存中，再以浮点数的视角取出来后,*pFloat的值依然是9.000000
	return 0;
}